#!/usr/bin/env python
# -*-coding:utf-8 -*-

__all__ = ['Message', 'getParam', 'getCommand', 'getSender', 'getCreateTime', 'getDelay']

import pickle

class Message(object):
    """
    机器人与服务器之间通信的消息。调度的结果为节点、到达节点的时间的一个序列。为使得机器人能够理解这个序列，需要一个能够支持编解码的时间类。
    """
    CMD_ROBOT_POS_UPDATE = 0
    
    CMD_TCS_SCHEDULE = 128
    CMD_TCS_PAUSE    = 129

    def __init__(self, time, sender, receiver, cmd, param, delay):
        self._cmd = cmd
        self._param = param
        self._sender = sender
        self._receiver = receiver
        self._create_time = time
        self._delay = delay

    def getParam(self):
        """
        获取消息中的参数字段。
        :return: 消息中的参数字段。
        """
        return self._param

    def getCommand(self):
        """
        获取消息的控制指令字段。
        :return: 消息的指令字段。可能的指令有：CMD_ROBOT_POS_UPDATE。
        """
        return self._cmd

    def getSender(self):
        """
        获取消息的发送者。
        :return: 消息的发送者。
        """
        return self._sender
        
    def getReceiver(self):
        """
        获取消息的接收者。
        :return: 消息的接收者。
        """
        return self._receiver

    def getCreateTime(self):
        """
        获取消息的创建时间。
        :return: 消息的创建时间。
        """
        return self._create_time

    def getDelay(self):
        """
        获取消息在传输过程中的时延。
        :return: 消息的时延。
        """
        return self._delay
       
    @staticmethod 
    def encode(msg):
        """
        将消息编码。本方法为静态方法。
        :param msg: Message对象，待编码的消息对象。
        :return: 编码生成的字符串。
        """
        return pickle.dumps(msg, pickle.HIGHEST_PROTOCOL)

    @staticmethod 
    def decode(str):
        """
        与encoding对应，把一个字符串对象解码。本方法为静态方法。
        :param str: 字符串，待解码的字符串。
        :return: 解码生成的Message对象。
        """
        return pickle.loads(str)
        

if __name__ == '__main__':
    from robot import Robot
    robot = Robot(0, '1')
    msg = Message(0, robot, Message.CMD_ROBOT_POS_UPDATE, 0, 1)
    str = Message.encode(msg)
    print(str)

    new_msg = Message.decode(str)
    print(new_msg.getSender())
    print(new_msg.getCommand())
    print(new_msg.getParam())
    print(new_msg.getDelay())
